package com.yu8home.opcua.test;

import com.yu8home.opcua.OpcUAUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@Slf4j
public class WritePool {
    public static ExecutorService pool = Executors.newFixedThreadPool(4);

    public static void main(String[] args) throws Exception {
        OpcUAUtil.getConnect();

        long x = System.currentTimeMillis();
        List<OpcUABO> rows = new ArrayList<>();

        OpcUABO a = new OpcUABO();
        a.setMarkName("aaaa.1.温度偏高报警值");// 300
        a.setRawDataType("Word");
        a.setValue("300");
        rows.add(a);

        OpcUABO b = new OpcUABO();
        b.setMarkName("aaaa.1.温度偏低报警值");// 100
        b.setRawDataType("Word");
        b.setValue("100");
        rows.add(b);

        OpcUABO c = new OpcUABO();
        c.setMarkName("aaaa.1.氧气偏低报警值");// 1800
        c.setRawDataType("Word");
        c.setValue("1800");
        rows.add(c);

        OpcUABO d = new OpcUABO();
        d.setMarkName("aaaa.1.氧气偏高报警值");// 2500
        d.setRawDataType("Word");
        d.setValue("2500");
        rows.add(d);

        OpcUABO aa = new OpcUABO();
        aa.setMarkName("aaaa.2.温度偏高报警值");// 300
        aa.setRawDataType("Word");
        aa.setValue("300");
        rows.add(aa);

        OpcUABO bb = new OpcUABO();
        bb.setMarkName("aaaa.2.温度偏低报警值");// 100
        bb.setRawDataType("Word");
        bb.setValue("100");
        rows.add(bb);

        OpcUABO cc = new OpcUABO();
        cc.setMarkName("aaaa.2.氧气偏低报警值");// 1800
        cc.setRawDataType("Word");
        cc.setValue("1800");
        rows.add(cc);

        OpcUABO dd = new OpcUABO();
        dd.setMarkName("aaaa.2.氧气偏高报警值");// 2500
        dd.setRawDataType("Word");
        dd.setValue("2500");
        rows.add(dd);

        CountDownLatch countDownLatch = new CountDownLatch(rows.size());
        for (OpcUABO t : rows) {
            pool.execute(() -> {
                try {
                    OpcUAUtil.writeNodeValue(t.getMarkName(), t.getValue(), t.getRawDataType());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                countDownLatch.countDown();
            });
        }
        countDownLatch.await();
        log.info("写耗时：{}", System.currentTimeMillis() - x);
    }

}
